//record 将对象所有的属性的值转化为T类型
//用Record<K extends keyof any,T>
type Property="use1"|"use2"
type User=Record<Property,string>//把个属性都变成字符串类型
const u:User={
    use1:"xuexi",
    use2:"xueke"
}

//Readonly 将数组或对象的属性值转换为只读的，

interface User1{
    name:string,
    age:number,
    gender?:"male"|"female"
}
let u1: Readonly<User1>  ={
    name:"hello",
    age:23
}
// u1.name = "world"     // 错误：无法分配到 "name"，因为它是只读属性
// u1.age = 30          // 错误：无法分配到 "age"，因为它是只读属性
// u1.gender = "male"   // 错误：无法分配到 "gender"，因为它是只读属性

//required 将类型的所有属性变成必选
interface User2{
    name?:string,
    age?:number,
    gender?:"male"|"female"
}
let u2: Required<User2>  ={
    name:"hello",
    age:23,
    gender:"male"
}

//partial 将类型的所有属性转换为可选属性
interface User3{
    name:string,
    age:number,
    gender:"male"|"female"
}
let u3: Partial<User3>  ={
    name:"hello",
    age:23,
}
 
//extract 提取联合类型中的某些类型，用extract<T,U>，表示从T中提取出U
type U=Extract<string|number|(()=>void),Function>
// 等价于： type U = () => void

//exclude  移除联合类型中某些类型，用Exclude<T,U>，表示从T中移除U
type U1=Exclude<"string"|"number"|"boolean","string">
// 等价于：type U1 = "number" | "boolean"

//pick 从类型中挑出一些属性
type User4={
    name:string,
    age:number,
    gender:"male"|"female"
}
type U2=Pick<User4,"name"|"age">
const user:U2={
    name:"sixue",
    age:12
}

//omit 从类型中移除一些属性，用omit,omit<T,K>从T中取出除去K的其他所有属性
interface User5{
    name:string,
    age:number,
    gender:"male"|"female"
}
type U3=Omit<User5,"age"|"gender">
const user2:U3={
    name:"xuexi"
}

//nonnullable 去除类型中的null和undefined
type U4=NonNullable<string[]|null|undefined>
// 等价于：type U4 = string[]


//parameters 获取函数的参数类型所组成的元组类型
type U5=Parameters<(a:number,b:string)=>void>

/*函数类型：(a: number, b: string) => void
参数：a: number, b: string
结果：[a: number, b: string]（元组类型） */

// 等价于：type U5 = [a: number, b: string]
//元组（Tuple） 是 TypeScript 中的一种特殊数组类型，它确切地知道包含多少个元素，以及每个位置上元素的特定类型。


//returntype 获取函数的返回值类型
type Func=(value:string)=>string
const u4:ReturnType<Func>="1"
//这类似于：const name: string = "John"

/*Func 类型：(value: string) => string

返回值类型：string

所以 ReturnType<Func> = string */


/*这表示：

定义了一个类型别名 Func

Func 是一个函数类型

该函数接受一个 string 类型的参数 value

该函数返回一个 string 类型的值*/